/*!
 * \file HftStrategyDefs.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief HFT策略定义文件
 * \details 定义了HFT策略的基础类和策略工厂接口，提供HFT策略开发的核心框架
 */
#pragma once
#include <string>
#include <stdint.h>

#include "../Includes/WTSMarcos.h"

NS_WTP_BEGIN
class WTSVariant;
class IHftStraCtx;
class WTSTickData;
class WTSOrdDtlData;
class WTSOrdQueData;
class WTSTransData;
struct WTSBarStruct;
NS_WTP_END

USING_NS_WTP;

/**
 * @class HftStrategy
 * @brief HFT策略基类
 * @details HFT(High Frequency Trading)策略的基础类，提供高频交易策略开发的基本框架。
 *          主要功能包括：
 *          - 策略生命周期管理
 *          - 高频市场数据事件处理
 *          - Level2深度数据处理
 *          - 交易执行和订单管理
 *          - 通道状态监控
 *          
 *          HFT策略主要用于毫秒级和微秒级的高频交易，通常基于市场微观结构
 *          和订单流分析进行交易决策。策略开发者需要继承此类并实现
 *          相应的事件处理方法，特别注意性能优化和延迟控制。
 */
class HftStrategy
{
public:
	/**
	 * @brief 构造函数
	 * @param id 策略实例ID
	 */
	HftStrategy(const char* id) :_id(id){}
	virtual ~HftStrategy(){}

public:
	/**
	 * @brief 获取策略名称
	 * @details 返回策略的唯一标识名称，用于策略识别和管理。
	 * @return const char* 策略名称
	 */
	virtual const char* getName() = 0;

	/**
	 * @brief 获取策略工厂名称
	 * @details 返回创建此策略的工厂名称，用于策略来源追踪。
	 * @return const char* 策略工厂名称
	 */
	virtual const char* getFactName() = 0;

	/**
	 * @brief 策略初始化
	 * @details 策略启动时的初始化方法，用于加载配置和设置初始状态。
	 * @param cfg 配置参数对象
	 * @return bool true表示初始化成功，false表示失败
	 */
	virtual bool init(WTSVariant* cfg){ return true; }

	/**
	 * @brief 获取策略实例ID
	 * @return const char* 策略实例ID
	 */
	virtual const char* id() const { return _id.c_str(); }

	/**
	 * @brief 策略初始化回调
	 * @details 策略框架初始化完成后的回调函数，必须实现此方法进行策略特定的初始化操作。
	 * @param ctx HFT策略上下文指针
	 */
	virtual void on_init(IHftStraCtx* ctx) = 0;
	
	/**
	 * @brief 交易会话开始回调
	 * @details 每个交易日会话开始时的回调函数，可以在此进行日初处理。
	 * @param ctx HFT策略上下文指针
	 * @param uTDate 交易日期，格式为yyyyMMdd
	 */
	virtual void on_session_begin(IHftStraCtx* ctx, uint32_t uTDate) {}
	
	/**
	 * @brief 交易会话结束回调
	 * @details 每个交易日会话结束时的回调函数，可以在此进行日终处理。
	 * @param ctx HFT策略上下文指针
	 * @param uTDate 交易日期，格式为yyyyMMdd
	 */
	virtual void on_session_end(IHftStraCtx* ctx, uint32_t uTDate) {}

	/**
	 * @brief Tick数据回调
	 * @details 实时tick数据到达时的回调函数，用于处理最新的价格和成交信息。
	 * @param ctx HFT策略上下文指针
	 * @param code 合约代码
	 * @param newTick 新的tick数据
	 */
	virtual void on_tick(IHftStraCtx* ctx, const char* code, WTSTickData* newTick) {}
	
	/**
	 * @brief 委托队列数据回调
	 * @details Level2委托队列数据更新时的回调函数，提供买卖队列的详细信息。
	 * @param ctx HFT策略上下文指针
	 * @param code 合约代码
	 * @param newOrdQue 新的委托队列数据
	 */
	virtual void on_order_queue(IHftStraCtx* ctx, const char* code, WTSOrdQueData* newOrdQue) {}
	
	/**
	 * @brief 委托明细数据回调
	 * @details Level2委托明细数据更新时的回调函数，提供逐笔委托的详细信息。
	 * @param ctx HFT策略上下文指针
	 * @param code 合约代码
	 * @param newOrdDtl 新的委托明细数据
	 */
	virtual void on_order_detail (IHftStraCtx* ctx, const char* code, WTSOrdDtlData* newOrdDtl) {}
	
	/**
	 * @brief 成交明细数据回调
	 * @details Level2成交明细数据更新时的回调函数，提供逐笔成交的详细信息。
	 * @param ctx HFT策略上下文指针
	 * @param code 合约代码
	 * @param newTrans 新的成交明细数据
	 */
	virtual void on_transaction(IHftStraCtx* ctx, const char* code, WTSTransData* newTrans) {}
	
	/**
	 * @brief K线数据回调
	 * @details K线数据更新时的回调函数，可以在此进行基于K线的策略逻辑。
	 * @param ctx HFT策略上下文指针
	 * @param code 合约代码
	 * @param period K线周期，如"m1"、"s5"等
	 * @param times 周期倍数
	 * @param newBar 新的K线数据
	 */
	virtual void on_bar(IHftStraCtx* ctx, const char* code, const char* period, uint32_t times, WTSBarStruct* newBar) {}

	/**
	 * @brief 成交回调
	 * @details 策略订单成交时的回调函数，用于处理成交确认信息。
	 * @param ctx HFT策略上下文指针
	 * @param localid 本地订单ID
	 * @param stdCode 标准合约代码
	 * @param isBuy 是否为买入订单
	 * @param vol 成交数量
	 * @param price 成交价格
	 * @param userTag 用户标签
	 */
	virtual void on_trade(IHftStraCtx* ctx, uint32_t localid, const char* stdCode, bool isBuy, double vol, double price, const char* userTag) {}
	
	/**
	 * @brief 持仓变化回调
	 * @details 策略持仓发生变化时的回调函数，用于监控持仓状态。
	 * @param ctx HFT策略上下文指针
	 * @param stdCode 标准合约代码
	 * @param isLong 是否为多头持仓
	 * @param prevol 变化前总持仓
	 * @param preavail 变化前可用持仓
	 * @param newvol 变化后总持仓
	 * @param newavail 变化后可用持仓
	 */
	virtual void on_position(IHftStraCtx* ctx, const char* stdCode, bool isLong, double prevol, double preavail, double newvol, double newavail) {}
	
	/**
	 * @brief 订单状态回调
	 * @details 策略订单状态发生变化时的回调函数，用于监控订单执行状态。
	 * @param ctx HFT策略上下文指针
	 * @param localid 本地订单ID
	 * @param stdCode 标准合约代码
	 * @param isBuy 是否为买入订单
	 * @param totalQty 订单总数量
	 * @param leftQty 剩余未成交数量
	 * @param price 订单价格
	 * @param isCanceled 是否已撤销
	 * @param userTag 用户标签
	 */
	virtual void on_order(IHftStraCtx* ctx, uint32_t localid, const char* stdCode, bool isBuy, double totalQty, double leftQty, double price, bool isCanceled, const char* userTag) {}
	
	/**
	 * @brief 交易通道就绪回调
	 * @details 交易通道连接成功并准备就绪时的回调函数。
	 * @param ctx HFT策略上下文指针
	 */
	virtual void on_channel_ready(IHftStraCtx* ctx) {}
	
	/**
	 * @brief 交易通道断开回调
	 * @details 交易通道连接断开时的回调函数，需要处理断线重连逻辑。
	 * @param ctx HFT策略上下文指针
	 */
	virtual void on_channel_lost(IHftStraCtx* ctx) {}
	
	/**
	 * @brief 委托确认回调
	 * @details 订单委托确认时的回调函数，用于处理订单提交结果。
	 * @param localid 本地订单ID
	 * @param bSuccess 委托是否成功
	 * @param message 消息内容
	 * @param userTag 用户标签
	 */
	virtual void on_entrust(uint32_t localid, bool bSuccess, const char* message, const char* userTag) {}

protected:
	std::string _id;	///< 策略实例ID
};

//////////////////////////////////////////////////////////////////////////
/// @brief HFT策略枚举回调函数类型
/// @param factName 工厂名称
/// @param straName 策略名称
/// @param isLast 是否为最后一个策略
typedef void(*FuncEnumHftStrategyCallback)(const char* factName, const char* straName, bool isLast);

/**
 * @class IHftStrategyFact
 * @brief HFT策略工厂接口
 * @details HFT策略工厂的核心接口，负责策略的创建、删除和管理。
 *          主要功能包括：
 *          - 策略实例创建和销毁
 *          - 策略类型枚举
 *          - 工厂标识管理
 *          
 *          策略工厂采用工厂模式设计，支持动态加载和卸载策略模块，
 *          为高频交易策略系统提供灵活的扩展机制。特别适用于需要
 *          快速部署和更新的高频交易环境。
 */
class IHftStrategyFact
{
public:
	IHftStrategyFact(){}
	virtual ~IHftStrategyFact(){}

public:
	/**
	 * @brief 获取工厂名称
	 * @details 返回策略工厂的唯一标识名称。
	 * @return const char* 工厂名称
	 */
	virtual const char* getName() = 0;

	/**
	 * @brief 枚举策略
	 * @details 枚举工厂支持的所有策略类型，通过回调函数返回策略信息。
	 * @param cb 枚举回调函数，用于接收策略信息
	 */
	virtual void enumStrategy(FuncEnumHftStrategyCallback cb) = 0;

	/**
	 * @brief 根据策略名称创建策略实例
	 * @details 根据指定的策略名称和实例ID创建新的HFT策略实例。
	 * @param name 策略名称
	 * @param id 策略实例ID
	 * @return HftStrategy* 策略实例指针，创建失败返回nullptr
	 */
	virtual HftStrategy* createStrategy(const char* name, const char* id) = 0;

	/**
	 * @brief 删除策略实例
	 * @details 销毁指定的策略实例并释放相关资源。
	 * @param stra 要删除的策略实例指针
	 * @return bool true表示删除成功，false表示失败
	 */
	virtual bool deleteStrategy(HftStrategy* stra) = 0;
};

/// @brief 创建HFT策略工厂函数指针类型
typedef IHftStrategyFact* (*FuncCreateHftStraFact)();

/// @brief 删除HFT策略工厂函数指针类型
typedef void(*FuncDeleteHftStraFact)(IHftStrategyFact* &fact);
